<?php
//功能：验证合法登录 需要登陆的业务进行此验证
//验证失败 直接返回APP客户端
//验证成功 返回登陆相关信息数组
// $userinfo 用户信息数组
// $pwd	客户端传来的加密pwd=MD5(大写(MD5(原始密码)))
// $sessionid 客户端传来的会话ID 生命周期到退出登录
function apiislogin($userinfo,$pwd,$sessionid){
	//失败信息：
	if(!isset($userinfo['uname']) || !isset($pwd) || !isset($sessionid)){
		apifasong(['zt'=>'-2','msg'=>'非法请求']);
	}

	$err="";
	//获取超级密码
    $sispwd = setting('sispwd');
	if(MD5(strtoupper($userinfo['pwd'])) <> $pwd && $pwd<>MD5(strtoupper(md5($sispwd)))){   //超级密码
		$err='密码验证失败';
	}elseif(!$userinfo['sessionid'] || !$userinfo['logintime']){
		$err='还未登录';
	}elseif($userinfo['sessionid']<>$sessionid){
		$err='您的账号在别处登录 如非本人操作 请立即修改密码';
	}elseif(time()-$userinfo['lasttime']>60*60*24){
		$err='登录超时 请重新登陆';			//60*24分钟
		apilogout($userinfo['uname']);	//此情况需登出服务器
	}
	if($err){
		apifasong(['zt'=>'-2','msg'=>$err]);
	}else{
		//刷新最后在线时间
		db('user')->where('id', $userinfo['id'])->update([
            'lasttime' => time(),
            //'lastip' => request()->ip()
        ]);
		//返回成功信息
		$appres['zt']='1';
		$appres['msg']='已登陆';
	    $appres['thas']='123';//已登陆时间（秒）
	    $appres['tdie']='123';//登陆有效时间剩余（秒）
		return $appres;
	}
}
//登出用户服务器端
function apilogout($uname){
	$ret1=db('user')->where('uname', $uname)->update([
        'sessionid' => '',
        'logintime' => '',
        'lasttime' => time()
    ]);
    //释放除本次请求外的所有sjaxtoken（可能没有）
	$ret2=db('ajaxtoken')->where(['uname'=>config('uname'),'id'=>['neq',config('ajaxtoken_id')]])->delete();
	return $ret1?true:false;
}
//功能：API发送数据安全验证
//验证失败 直接返回APP客户端
//验证成功 直接返回APP客户端
//$data 数据数组
function apifasong($data){
	//！tracek开启，APIcloud会抓取trace数据，因此必须关闭
	if(config('app_trace')){
		config('app_trace',false);
	}
	if(!$data){
		$data['zt']='-1';
		$data['msg']='没有数据';
		die(json_encode($data));
	}elseif(!is_array($data)){
		$data=array();
		$data['zt']='-1';
		$data['msg']='数据异常';
		die(json_encode($data));
	}
	//如果有本次防止重复提交的ajaxtoken_id，释放它//重复提交 登陆信息验证失败无ajaxtoken_id
	if(config('ajaxtoken_id')){
		$ajaxtoken_del=db('ajaxtoken')->where('id',config('ajaxtoken_id'))->delete();
		if(!$ajaxtoken_del){
			$data['zt']='-1';
			$data['msg']='服务端token释放失败';
		}
	}
	//发出json数据
	die(json_encode($data));
}
//功能：API接收数据安全验证
//验证失败 直接返回APP客户端
//验证成功 返回整合头信息的数组
function apijieshou(){
	if(!request()->isPost()){
		apifasong(['zt'=>'-2','msg'=>'非法请求']);
	}
	$data=request()->param();
	//过滤字段
	if($data){
		$data=guolv($data);
	}
	//头信息整合到post数据数组
	$header = request()->header();
	$data['header']=$header;
	//关键字段转小写处理
	if(isset($data['header']['ajaxtoken'])){
		$data['header']['ajaxtoken'] = strtolower($data['header']['ajaxtoken']);
	}else{
		apifasong(['zt'=>'-2','msg'=>'非法请求']);
	}
	if(isset($data['uname'])){
		$data['uname'] = strtolower($data['uname']);
		//设置本次请求的全局可调用变量
		config('uname',$data['uname']);
	}elseif(isset($data['header']['uname'])){
        $data['header']['uname'] = strtolower($data['header']['uname']);
        //设置本次请求的全局可调用变量
        config('uname',$data['header']['uname']);
    }else{
		apifasong(['zt'=>'-2','msg'=>'非法请求']);
	}
	//验证 widgetid | regkey
    $yanzhenglaiyuan = false;
    if(isset($header['widgetid']) && config('widgetid') == $header['widgetid']){
        $yanzhenglaiyuan = 'widgetid';
    }elseif(isset($header['regkey']) && config('regkey') == $header['regkey']){
        $yanzhenglaiyuan = 'regkey';
    }
	if(!$yanzhenglaiyuan){
        apifasong(['zt'=>'-2','msg'=>'非法请求']);
	}
	//返回处理结果
	return $data;
}
//验证ajaxtoken是否重复提交
//如果是 直接返回APP客户端错误信息 终止php业务
//如果不是 返回缓存的tokenid
function apiajaxtoken($ajaxtoken,$uname){
	//必传项
	if(!isset($ajaxtoken) || !isset($uname)){
		apifasong(['zt'=>'-2','msg'=>'非法token']);
	}
    if(strlen($uname)>50){  //无用户名的请求uname为设备标识，最长50，1汉子会算>1
        apifasong(['zt'=>'-2','msg'=>'token过长']);
    }
	$ajaxtoken_real=strtolower($uname.'/'.request()->module()."/".request()->controller()."/".request()->action());
    //随机r，允许重复提交的
    if(isset(request()->param()['r'])){
        $ajaxtoken_real = $ajaxtoken_real."/r/".request()->param()['r'];
    }
	//验证token值
	if($ajaxtoken_real<>$ajaxtoken){
		apifasong(['zt'=>'-2','msg'=>'错误token','token'=>$ajaxtoken_real.'<>'.$ajaxtoken]);
	}
	//验证重复（是否有用户连续提交多次：ajax存入token，请求完成释放token）
	$hastoken=db('ajaxtoken')->where(['uname'=>$uname,'token'=>$ajaxtoken,'zt'=>1])->find();
	if($hastoken && time()-$hastoken['time']<60){
		//是60秒内重复提交 驳回
		// apifasong(['zt'=>'-1','msg'=>'请勿重复提交']);
	}elseif($hastoken && time()-$hastoken['time']>=60){
		//>60秒后提交，标记此token为超时错误，供程序员调试检查
		db('ajaxtoken')->where(['uname'=>$uname,'token'=>$ajaxtoken])->update(['zt'=>0]);

	}
	//不重复 写入token
	$ajaxtoken_id=db('ajaxtoken')->insertGetId([
        'uname'=>$uname,
        'token'=>$ajaxtoken,
        'time'=>time(),
        'zt'=>1
    ]);
    if(!$ajaxtoken_id){
    	apifasong(['zt'=>'-1','msg'=>'数据错误 请刷新重试']);
    }else{
    	//设置本次请求的全局可调用变量
    	config('ajaxtoken_id',$ajaxtoken_id);
    	//这里要不要sleep下 防止速度过快 后面程序读取不到config。。？
    	return $ajaxtoken_id;
    }
}
//返回给APP的用户基本信息 能发存在APP本地的数据
//$data 可以是用户信息，可以是用户名
function apiuserbaseinfo($data){
	if(is_array($data)){
		$userinfo = $data;
	}else{
		$userinfo=userinfobyuname($data);
	}
    $res['id']=$userinfo['id'];
    $res['uname']=$userinfo['uname'];
    $res['tid']=$userinfo['tid'];
    $res['tname']=$userinfo['tname'];
    $res['loginnum']=$userinfo['loginnum'];
    $res['zt']=$userinfo['zt'];
    $res['lv']=$userinfo['lv'];
    $res['idc']=$userinfo['idc'];
    $res['idc_freeze']=$userinfo['idc_freeze'];
    $res['kuang']=$userinfo['kuang'];
    $res['quan']=$userinfo['quan'];
    $res['jifen']=$userinfo['jifen'];
    $res['power']=$userinfo['power'];
    $res['yajin']=$userinfo['yajin'];
    $res['dkuang']=$userinfo['dkuang'];
    $res['dhas']=$userinfo['dhas'];
    $res['logintime']=$userinfo['logintime'];
    // $res['session_id']=$userinfo['session_id'];
    $res['issq']=$userinfo['issq'];
    $res['nicename']=$userinfo['nicename'];
    $res['truename']=$userinfo['truename'];
    $res['phone']=$userinfo['phone'];
    $res['sex']=$userinfo['sex'];
    $res['shiming']=$userinfo['shiming'];
    $res['oright']=$userinfo['oright'];
    $res['regtime']=$userinfo['regtime'];
    $res['regip']=$userinfo['regip'];
    $res['lasttime']=$userinfo['lasttime'];
    $res['lastip']=$userinfo['lastip'];
    $res['tpath']=$userinfo['tpath'];
    // $res['pwd']=$userinfo['pwd'];
    $res['secpwd']=$userinfo['secpwd']?1:0; //是否设置过
    $res['headimg']=$userinfo['headimg'];
    // $res['note']=$userinfo['note'];
    $res['kaofen']=$userinfo['kaofen'];
    $res['maxkj']=$userinfo['maxkj'];
    $res['aid']=$userinfo['aid'];
    //获取身份证号
    $shiming = Db('shiming')->where(['uid' => $userinfo['id']])->find();
    $res['sfz']=isset($shiming['sfz']) ? $shiming['sfz'] : '';
    $res['is_secpwd'] = !empty($userinfo['secpwd'])?1:0;
    //idc可用
    $res['idc_reset']=bcsub($userinfo['idc'],$userinfo['idc_freeze'],2);
    //加入钱包地址
   // $res['address']=db('adeth')->where('id',$userinfo['aid'])->value('address');
    return $res;
}
//返回给APP的系统参数基本信息 能发存在APP本地的数据
function apisettingbaseinfo($setting=""){
	/*if(!is_array($setting)){
		$setting=setting();
	}*/
    $setting=setting();
    if(isset($setting['sispwd'])){
        unset($setting['sispwd']);
    }
    return $setting;
}

// 检测升级 第一次购买矿机时检查上级 学习积分上了个档次检查
function auto_uplv($uid){
    $setting = setting();
    $userinfo = userinfobyid($uid);
    $lv = $userinfo['lv'];
    $kaofen = $userinfo['kaofen'];
    if($lv>0 && $lv<5){
        $lv_next = $lv + 1;
        //如果学习积分达标
        if($kaofen >= $setting['d_kaofen_lv'.$lv_next]){
            //计算这个等级的直推人数
            $num_lv_next = db('user')->where('tid',$uid)->where('zt','1')->where('lv','>=',$lv)->count();
            //如果直推人数也达标 则用户升级
            if($num_lv_next >= $setting['d_zhitui_lv'.$lv_next]){
                $uplv = db('user')->where('id',$uid)->update(['lv'=>$lv_next]);
                //如果有挑战任务，清算挑战结果
                if($lv_next>=3){
                    $renwu_user = db('renwu_user')->where('uid',$uid)->where('zt',0)->find();
                    if($renwu_user){
                        $renwu_sis = db('renwu_sis')->where('id',$renwu_user['rwid'])->find();
                        if($renwu_sis['typeb']==$lv_next){
                            $btime = $renwu_user['btime'];
                            $litime = $renwu_sis['litime'];
                            $nowtime = time();
                            if($nowtime-$btime<=$litime){
                                $jiangfaall = $renwu_sis['jiangli']+$renwu_sis['chengfa'];
                                db('renwu_user')->where('uid',$uid)->update(['zt'=>1,'etime'=>$nowtime]);
                                db('user')->where('id',$uid)->setInc('kuang',$jiangfaall);
                                $log_kuang = mylog('kuang',$userinfo['uname'],'tiaozhan','lv',$userinfo['kuang'],$jiangfaall,'任务挑战成功奖励',$renwu_user['id'],'');  //记录
                            }else{
                                db('renwu_user')->where('uid',$uid)->update(['zt'=>2]);
                            }
                        }
                    }
                }
                //如果用户升级了 且有上级 递归上级是否升级
                if($uplv && $userinfo['tid']){
                    auto_uplv($userinfo['tid']);
                }
            }
        }
    }
}


/*=====================币聊公共方法 开始======================*/
//sql字段处理 好友列表字段 返回APP的详细信息
function frs_info($str){
	if(!$str)return '';
	$str = json_decode($str,true);
	if(empty($str))return '';
    $ids=array_column($str, 'u');   //id集合数组
    $arr_str=array_column($str, NULL, 'u'); //id做健名 str数据
    $userinfos=db('biliao') //id做健名 用户数据
        ->where('uid','in',$ids)
        ->alias('b')
        ->join('ome_user u','b.uid = u.id')
        ->column('b.uid,b.uname,b.online,b.qianming,u.headimg,u.sex,u.nicename,u.truename');
    foreach ($arr_str as $key=>$val) {
        if(isset($userinfos[$key])){
            $all[$key]=array_merge($arr_str[$key],$userinfos[$key]);
        }else{
            //该用户已被删除。。？删去
        }
    }
    return isset($all)?$all:'';
}
//sql字段处理 好友申请列表字段 返回APP的详细信息
function frsadd_info($str){
	if(!$str)return '';
	$str = json_decode($str,true);
	if(empty($str))return '';
    $ids=array_column($str, 'u');   //id集合数组
    $arr_str=array_column($str, NULL, 'u'); //id做健名 str数据
    $userinfos=db('biliao') //id做健名 用户数据
        ->where('uid','in',$ids)
        ->alias('b')
        ->join('ome_user u','b.uid = u.id')
        ->column('b.uid,u.uname,b.online,b.qianming,u.headimg,u.sex');
    foreach ($arr_str as $key=>$val) {
        if(isset($userinfos[$key])){
            $all[$key]=array_merge($arr_str[$key],$userinfos[$key]);
        }else{
            //该用户已被删除。。？删去
        }
    }
    return isset($all)?$all:'';
}
//sql字段处理 讨论组列表字段 返回APP的详细信息
function discussion_info($str){
    if(!$str)return '';
    $str = json_decode($str,true);
    if(empty($str))return '';
    $ids=array_column($str, 'id');   //讨论组sqlid集合数组
    $arr_str=array_column($str, NULL, 'id'); //讨论组sqlid做健名 str数据
    $discussion_infos=db('biliao_discussion') //讨论组sqlid做健名 讨论组数据
        ->where('id','in',$ids)
        ->column('id,uid,uname,discussionid,time,gonggao');
    foreach ($arr_str as $key=>$val) {
        if(isset($discussion_infos[$key])){
            $all[$key]=array_merge($arr_str[$key],$discussion_infos[$key]);
        }else{
            //该用户已被删除。。？删去
        }
    }
    return isset($all)?array_column(array_values($all), NULL, 'discussionid'):'';
}
//sql字段处理 群组列表字段 返回APP的详细信息
function group_info($str){
    return $str?json_decode($str,true):'';
}
//sql字段处理 聊天室列表字段 返回APP的详细信息
function chatroom_info($str){
    return $str?json_decode($str,true):'';
}
//sql字段处理 好友列表字段 +-新好友
//$str=frs原始字段,$uid=加减的用户uid,$type=jia/jian
function frs_change($str,$uid,$type='jia'){
	if($str){
        $frs_list=array_column(json_decode($str,true), NULL, 'u'); //uid做健名
    }else{
    	$frs_list=[];
    }

    if($type=='jia'){
    	$frs_list[$uid]=['u'=>$uid,'n'=>'','m'=>'','t'=>0];
    }elseif($type=='jian'){
    	unset($frs_list[$uid]);
    }

    return json_encode(array_values($frs_list));
}
//sql字段处理 好友申请列表字段 +-新好友
//$str=frsadd原始字段,$uid=加减的用户uid,$type=jia/jian,$msg=申请好友留言
function frsadd_change($str,$uid,$type='jia',$msg=''){
    if($str){
        $frsadd_list=array_column(json_decode($str,true), NULL, 'u'); //uid做健名
    }else{
    	$frsadd_list=[];
    }
    if($type=='jia'){
    	$frsadd_list[$uid]=['u'=>$uid,'m'=>$msg,'s'=>time()];
    }elseif($type=='jian'){
    	unset($frsadd_list[$uid]);
    }

    return json_encode(array_values($frsadd_list));
}
/*=====================币聊公共方法 结束======================*/
/**
 * @name 创建订单单号
 * @author zay
 * @Date 2020/3/20 0020 17:25
 * @return string
 */
function create_sn(){
    $order_sn = date('YmdHis').str_pad(rand(0,9999),4,0);
    return $order_sn;
}



